package com.ms.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ms.dao.UserMapper;
import com.ms.entity.User;
import com.ms.service.inter.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 用户服务实现类 - 实现UserService接口
 */
@Service
@Transactional
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 保存用户信息
     * @param user 用户对象
     * @return 保存结果
     */
    @Override
    public boolean save(User user) {
        try {
            int result = userMapper.insert(user);
            return result > 0;
        } catch (Exception e) {
            throw new RuntimeException("保存用户信息失败: " + e.getMessage(), e);
        }
    }

    /**
     * 根据用户ID查找用户
     * @param userID 用户ID
     * @return 用户对象
     */
    @Override
    public User findById(Integer userID) {
        try {
            return userMapper.selectById(userID);
        } catch (Exception e) {
            throw new RuntimeException("根据ID查找用户失败: " + e.getMessage(), e);
        }
    }

    /**
     * 根据用户名查找用户
     * @param username 用户名
     * @return 用户对象
     */
    @Override
    public User findByUsername(String username) {
        try {
            // 使用MyBatis-Plus的查询方式替代自定义方法
            return userMapper.selectOne(
                    new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<User>()
                            .eq("username", username)
            );
        } catch (Exception e) {
            throw new RuntimeException("根据用户名查找用户失败: " + e.getMessage(), e);
        }
    }

    /**
     * 根据邮箱查找用户
     * @param email 邮箱
     * @return 用户对象
     */
    @Override
    public User findByEmail(String email) {
        try {
            return userMapper.selectOne(
                    new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<User>()
                            .eq("email", email)
            );
        } catch (Exception e) {
            throw new RuntimeException("根据邮箱查找用户失败: " + e.getMessage(), e);
        }
    }

    /**
     * 根据手机号查找用户
     * @param phone 手机号
     * @return 用户对象
     */
    @Override
    public User findByPhone(String phone) {
        try {
            return userMapper.selectOne(
                    new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<User>()
                            .eq("phone", phone)
            );
        } catch (Exception e) {
            throw new RuntimeException("根据手机号查找用户失败: " + e.getMessage(), e);
        }
    }

    /**
     * 根据用户名、邮箱或手机号查找用户
     * @param account 用户名、邮箱或手机号
     * @return 用户对象
     */
    @Override
    public User findByAccount(String account) {
        try {
            return userMapper.selectOne(
                    new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<User>()
                            .eq("username", account)
                            .or()
                            .eq("email", account)
                            .or()
                            .eq("phone", account)
            );
        } catch (Exception e) {
            throw new RuntimeException("根据账号查找用户失败: " + e.getMessage(), e);
        }
    }

    /**
     * 更新用户信息
     * @param user 用户对象
     * @return 更新结果
     */
    @Override
    public boolean update(User user) {
        try {
            // 使用MyBatis-Plus的更新方法
            int result = userMapper.updateById(user);
            return result > 0;
        } catch (Exception e) {
            throw new RuntimeException("更新用户信息失败: " + e.getMessage(), e);
        }
    }

    /**
     * 删除用户
     * @param userID 用户ID
     * @return 删除结果
     */
    @Override
    public boolean delete(Integer userID) {
        try {
            // 使用MyBatis-Plus的删除方法
            int result = userMapper.deleteById(userID);
            return result > 0;
        } catch (Exception e) {
            throw new RuntimeException("删除用户失败: " + e.getMessage(), e);
        }
    }

    /**
     * 获取所有用户
     * @return 用户列表
     */
    @Override
    public List<User> findAll() {
        try {
            // 使用MyBatis-Plus的查询方法
            return userMapper.selectList(null);
        } catch (Exception e) {
            throw new RuntimeException("获取所有用户失败: " + e.getMessage(), e);
        }
    }
    
    /**
     * 查找指定年份前缀的最大numID
     * @param prefix 年份前缀，如"2023"
     * @return 最大的numID，如果没有找到则返回null
     */
    @Override
    public String findMaxNumIdForYear(String prefix) {
        try {
            return userMapper.findMaxNumIdForYear(prefix);
        } catch (Exception e) {
            throw new RuntimeException("查找最大numID失败: " + e.getMessage(), e);
        }
    }
}